package net.jcip.examples.chapter7;

import java.util.concurrent.*;
import static net.jcip.examples.LaunderThrowable.launderThrowable;

/**
 * TimedRun
 * <p/>
 * Cancelling a task using Future
 *
 * @author Brian Goetz and Tim Peierls
 */
public class TimedRun {
    private static final ExecutorService taskExec = Executors.newCachedThreadPool();

    public static void timedRun(Runnable r, long timeout, TimeUnit unit) throws InterruptedException {
        Future<?> task = taskExec.submit(r);
        try {
            //使用Future的get方法尝试在指定的timeout时间内获取任务的结果。如果任务在超时时间内没有完成，会抛出TimeoutException。
            task.get(timeout, unit);
        } catch (TimeoutException e) {
            // task will be cancelled below
            // TimeoutException：表示任务超时，没有特别处理，因为任务会在finally块中取消。
        } catch (ExecutionException e) {
            // exception thrown in task; rethrow
            throw launderThrowable(e.getCause());
        } finally {
            // Harmless if task already completed
            // 如果任务正在运行，cancel(true) 会中断任务。
            // 任务已经完成时，取消操作是无害的。
            task.cancel(true); // interrupt if running
        }
    }
}



